﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Librerias;
using System.Data;
using System.Collections;
using System.Data.SqlClient;

namespace Librerias
{
    /// <summary>
    /// Clase CAD que persiste las asignaturas
    /// </summary>
    public class CADAsignatura
    {
       // public void CrearAsignatura(String correoUsuario, String codAsignatura, String nombre, String descripcion, String archivo) { }
       // public String ConsultarBibliografia(String codAsignatura);
        //public void ModificarBibliografiayEnlaces(String codAsignatura, String texto);

        SqlConnection con;

        /// <summary>
        /// Constructor por defecto
        /// </summary>
        public CADAsignatura()
        {
            con = new SqlConnection(CADConexion.connString);
        }

        /// <summary>
        /// Nos devuelve asignaturas según un criterio
        /// </summary>
        /// <param name="valor">valor</param>
        /// <param name="criterio">criterio</param>
        /// <returns>DataSet con toda la información</returns>
        public DataSet getAsignaturasPorCriterio(String valor, String criterio) 
        { return null; }

        
        /// <summary>
        /// Consulta asignaturas por alumno
        /// </summary>
        /// <param name="correoAlumno">correo del alumno</param>
        /// <returns>DataTable con toda la info</returns>
        public DataTable ConsultaAsignaturasAlumno(string correoAlumno) 
        {
            
            con.Open();
            string select = "SELECT        asignatura.asiNombre, asignatura.asiCodigo " +
                            " FROM            cursar INNER JOIN  asignatura " +
                            " ON cursar.curCodigo = asignatura.asiCodigo " +
                            " AND cursar.curCorreo = '" + correoAlumno + "'";

            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            DataTable tabla = new DataTable();
            adaptadorSQL.Fill(tabla);
            return tabla;
        }

        public DataTable GetCodigosFromAlumno(string correo)
        {

            con.Open();
            string select = "SELECT        asignatura.asiCodigo,asignatura.asiNombre " +
                            " FROM            cursar INNER JOIN  asignatura " +
                            " ON cursar.curCodigo = asignatura.asiCodigo " +
                            " AND cursar.curCorreo = '" + correo + "'";

            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
            con.Close();

            DataTable tabla = new DataTable();
            adaptadorSQL.Fill(tabla);

            if (tabla.Columns.Count == 2)
            {
                tabla.Columns[0].ColumnName = "codigo";
                tabla.Columns[1].ColumnName = "nombre";
            }
            return tabla;
        }

        public DataTable GetCodigosFromProfesor(string correo)
        {

            con.Open();
            string select = "SELECT DISTINCT  asignatura.asiCodigo, asignatura.asiNombre " +
                            " FROM            turno INNER JOIN  asignatura " +
                            " ON  turno.turCodigo = asignatura.asiCodigo " +
                            " AND turno.turCorreo = '" + correo + "'";

            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
            con.Close();

            DataTable tabla = new DataTable();
            adaptadorSQL.Fill(tabla);

            if (tabla.Columns.Count == 2)
            {
                tabla.Columns[0].ColumnName = "codigo";
                tabla.Columns[1].ColumnName = "nombre";
            }

            return tabla;
        }

        //Añadida nueva funcion para rellenar asignaturas en el combobox
        /// <summary>
        /// Nos dirá todas las asignaturas con toda su información
        /// </summary>
        /// <returns>DataTable con la info</returns>
        public DataTable GetAsignaturas()
        {
            con.Open();
            string select = "SELECT a.asiCodigo, a.asiNombre, a.asiCreditos, a.asiReferencia, a.asiCuatrimestre " +
                            "FROM            asignatura a";

            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            DataTable tabla = new DataTable();
            adaptadorSQL.Fill(tabla);
            return tabla;
        }

        /// <summary>
        /// Nos devuelve las asignaturas con todos sus campos
        /// </summary>
        /// <returns>ArrayList para su tratamiento posterior</returns>
        public ArrayList ConsultaAsignaturas()
        {
            ArrayList res = null;

            try
            {
                con.Open();
                string select = "SELECT DISTINCT a.asiCodigo, a.asiNombre, a.asiCreditos, a.asiReferencia, a.asiCuatrimestre " +
                                "FROM            asignatura a";



                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

                DataTable tabla = new DataTable();
                adaptadorSQL.Fill(tabla);

                res = new ArrayList();
                for (int i = 0; i < tabla.Rows.Count; i++)
                {
                    
                    res.Add(new ENAsignatura(tabla.Rows[i][0].ToString(),
                                             tabla.Rows[i][1].ToString(),
                                             float.Parse(tabla.Rows[i][2].ToString()),
                                             tabla.Rows[i][3].ToString(),
                                             int.Parse(tabla.Rows[i][4].ToString())));
                }

            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
        }

        public String dameNombreAsig(String codAsig)
        {
            String res = "";

            try
            {
                con.Open();
                string select = "SELECT a.asiNombre " +
                                "FROM asignatura a where a.asiCodigo='"+codAsig+"'";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                DataTable tabla = new DataTable();
                adaptadorSQL.Fill(tabla);
                if (tabla.Rows.Count > 0)
                {
                    res = tabla.Rows[0][0].ToString();
                }

            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
        }

        /// <summary>
        /// Devuelve un arrayList de ENAsignaturas según un profesor
        /// </summary>
        /// <param name="correoProfesor">Profesor</param>
        /// <returns>ArrayList con todas sus asignaturas</returns>
        public ArrayList ConsultaAsignaturasProfesor(string correoProfesor)
        {
            ArrayList res = null;

            try
            {
                con.Open();
                string select = "SELECT DISTINCT a.asiCodigo, a.asiNombre, a.asiCreditos, a.asiReferencia, a.asiCuatrimestre " +
                                "FROM            asignatura AS a INNER JOIN " +
                                                "turno AS t ON a.asiCodigo = t.turCodigo CROSS JOIN " +
                                                "usuario AS u " +
                                "WHERE        (t.turCorreo = '" + correoProfesor + "') "+
                                         "AND (u.usuCorreo = '" + correoProfesor + "')";
                    
                    
                                        
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

                DataTable tabla = new DataTable();
                adaptadorSQL.Fill(tabla);

                res = new ArrayList();
                for (int i = 0; i < tabla.Rows.Count; i++)
                {
                    res.Add(new ENAsignatura(tabla.Rows[i][0].ToString(),
                                             tabla.Rows[i][1].ToString(),
                                             float.Parse(tabla.Rows[i][2].ToString()),
                                             tabla.Rows[i][3].ToString(),
                                             int.Parse(tabla.Rows[i][4].ToString())));
                }
                
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
        }

        /// <summary>
        /// Que devuelve un DataTable con las asignaturas de un profesor
        /// </summary>
        /// <param name="correoUsu">Usuario</param>
        /// <param name="tipoUsu">Tipo Usuario</param>
        /// <returns>DataTable con la info</returns>
        public DataTable ConsultaAsignaturasPorCorreoUsuYTipoDataTable(string correoUsu, int tipoUsu)
        {
            DataTable tabla = new DataTable();
            String [] selects = new String[2];
            try
            {
                con.Open();

                selects[0] = "SELECT  u.usuCorreo, u.usuNombre, u.usuApellido1, u.usuApellido2,u.usuDepto, a.asiCodigo, a.asiNombre, a.asiCreditos, a.asiReferencia, a.asiCuatrimestre " +
                                "FROM            asignatura AS a INNER JOIN " +
                                                "turno AS t ON a.asiCodigo = t.turCodigo CROSS JOIN " +
                                                "usuario AS u " +
                                "WHERE        (t.turCorreo = '" + correoUsu + "') " +
                                         "AND (u.usuCorreo = '" + correoUsu + "')";

                selects[1] = "SELECT  u.usuCorreo, u.usuNombre, u.usuApellido1, u.usuApellido2,u.usuDepto, a.asiCodigo, a.asiNombre, a.asiCreditos, a.asiReferencia, a.asiCuatrimestre " +
                                "FROM            asignatura AS a INNER JOIN " +
                                                "cursar AS c ON a.asiCodigo = c.curCodigo CROSS JOIN " +
                                                "usuario AS u " +
                                "WHERE        (c.curCorreo = '" + correoUsu + "') " +
                                         "AND (u.usuCorreo = '" + correoUsu + "')";

                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(selects[tipoUsu-1], con);

                adaptadorSQL.Fill(tabla);

            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return tabla;
        }

        /// <summary>
        /// Nos dice un código de asignatura según su nombre
        /// </summary>
        /// <param name="nombreBuscado">código buscado</param>
        /// <returns>DataTable Código de Asignatura</returns>
        public DataTable DimeCodigoSegunNombre(string nombreBuscado)
        {
            DataTable tabla = new DataTable();

            try
            {
                con.Open();
                string select = "select asiCodigo from asignatura where (asiNombre='" + nombreBuscado + "');";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
              
                adaptadorSQL.Fill(tabla);               
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }
            return tabla;
        }

        /// <summary>
        /// Consultará cuatrimestre
        /// </summary>
        /// <returns>ArrayList que nos devuelve</returns>
        public ArrayList ConsultaCuatrimestre()
        {
            ArrayList res = null;

            try
            {
                con.Open();
                string select = "SELECT distinct asiCuatrimestre from asignatura";


                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

                DataTable tabla = new DataTable();
                adaptadorSQL.Fill(tabla);

                res = new ArrayList();
                for (int i = 0; i < tabla.Rows.Count; i++)
                {
                    res.Add(new ENAsignatura(tabla.Rows[i][0].ToString(),
                                            tabla.Rows[i][1].ToString(),
                                            float.Parse(tabla.Rows[i][2].ToString()),
                                            tabla.Rows[i][3].ToString(),
                                            int.Parse(tabla.Rows[i][4].ToString())));
                }
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
        }

        /// <summary>
        /// Busca un codigo de una asignatura y nos dice si existe
        /// </summary>
        /// <param name="codigo">código de la asignatura</param>
        /// <returns>V si ok</returns>
        public bool BuscarCodigo(string codigo)
        {
            bool encontrado = false;
            string sql;
            CADConexion miConexion = new CADConexion();
            SqlConnection c = new SqlConnection(CADConexion.connString);
            c.Open();
            DataSet DS = new DataSet();
            int filas = 0;
            try
            {
                encontrado = false;
                //primero inicializad la conexion
                sql = "select asiCodigo from asignatura where  asignatura.asiCodigo like '%" + codigo + "%' ";
                filas = miConexion.Consultar(sql, c, ref DS, "asignatura");
                if (filas > 0)
                    encontrado = true;
            }
            catch (Exception ex)
            {
                throw new System.Exception("Error al consultar en la tabla 'Persona'\n" + ex.Message.ToString());
            }
            finally
            {
                c.Close();
            }
            return encontrado;
        }

        /// <summary>
        /// Persisten asignatura pasándole una EN
        /// </summary>
        /// <param name="entidadAsignatura">EN Asignatura</param>
        public void CrearAsignatura(ENAsignatura entidadAsignatura)
        {
            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                SqlCommand com = new SqlCommand("insert into asignatura (asiCodigo, asiNombre, asiCreditos, asiReferencia, asiCuatrimestre) values('" +
                                                entidadAsignatura.Codigo + "','" +
                                                entidadAsignatura.Nombre + "'," +
                                                entidadAsignatura.Creditos + ",'" +
                                                entidadAsignatura.Referencia + "'," +
                                                entidadAsignatura.Cuatrimestre + ");", con);

                com.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new System.Exception("Error al insertar en la tabla 'asignatura'\n" + ex.Message);
            }
            finally
            {
                con.Close();
            }
        }

        /// <summary>
        /// Modifica una asignatura a través de una EN que llega
        /// </summary>
        /// <param name="entidadAsignatura">EN</param>
        public void ModificarAsignatura(ENAsignatura entidadAsignatura)
        {
            SqlConnection c = new SqlConnection(CADConexion.connString);
            con.Open();
            new SqlCommand("update asignatura set " +
                                "asiNombre = '" + entidadAsignatura.Nombre +
                                "', asiCreditos = " + entidadAsignatura.Creditos.ToString().Replace(",",".") +
                                ", asiCuatrimestre = " + entidadAsignatura.Cuatrimestre.ToString().Replace(",", ".") +
                                " where asiCodigo='" + entidadAsignatura.Codigo + "';", con).ExecuteNonQuery();
            c.Close();
        }

        /// <summary>
        /// Borra una asignatura (según la EN que le pasemos)
        /// </summary>
        /// <param name="asig">Asignatura</param>
        public void BorrarAsignatura(ENAsignatura asig)
        {

            int res = 0;
            SqlConnection c = new SqlConnection(CADConexion.connString);
            try
            {
                c.Open();
                SqlCommand com = new SqlCommand("delete from asignatura where asiCodigo = '" + asig.Codigo + "';", c);

                res = com.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                throw new System.Exception("Error al eliminar en la tabla " + ex.Message);
            }
            finally
            {

                c.Close();
            }
        }
        #region ConsultaUsuarios(string cadena, int tipo)-doc
        /// <summary>
        /// Dada una cadena la busca en un tipo usuario
        /// </summary>
        /// <param name="cadena">cadena a buscar</param>
        /// <param name="tipo">tipo</param>
        /// <returns>Datatable con la información encontrada</returns>
        public DataTable ConsultaAsignaturas(string cadena, int tipo)
        {
            DataTable res = new DataTable();

            try
            {
                con.Open();
                string select = "select * from asignatura";

                switch (tipo)
                {
                    case 0:
                        select += " where asiCodigo like '%" + cadena + "%'";
                        break;
                    case 1:
                        select += " where asiNombre like '%" + cadena + "%'";
                        break;
                    case 2:
                        select += " where asiCreditos like '%" + cadena + "%'";
                        break;
                    case 3:
                        select += " where asiCuatrimestre like '%" + cadena + "%'";
                        break;
                }
                select += " order by asiCodigo desc";

                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);

            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return res;
        }
        #endregion

    }
}
